import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**Cette classe permet de gérer les phéromones déposées par les fourmis lorsqu'elles passent de noeuds en noeuds.
 * 
 * @author Pocman
 *
 */
public class AntInstance {
	
		private Instance instance;
	    private double[][] tau;
	    private double     tau0;
	    private int iterateur;


	    /**constructeur de la classe AntInstance
	     * @param instance
	     */
	    public AntInstance(Instance instance){
	    	this.instance = instance; 
	    	this.iterateur = 0;
	    	this.initialiserTau();	 
	    	
	    }
	    

	    /**fonction qui retourne tau
	     * @param i
	     * @param j
	     * @return
	     */
	    public synchronized double getTau(int i, int j){
	    	if(i < j)
				return this.tau[j][i];
	    	else
	    		return this.tau[i][j];
	    }
	    
	    /**fonction qui retourne tau0
	     * @return
	     */
	    public double getTau0(){
	    	return this.tau0;
	    }
	    
	    /**fonction qui retourne la distance entre deux noeuds
	     * @param i
	     * @param j
	     * @return
	     * @throws Exception
	     */
	    public synchronized double getDistance(int i, int j) throws Exception{
	    	return this.instance.getDistances(i +1, j +1);
	    }
	    
	    /** méthode qui met à jour tau
	     * @param i
	     * @param j
	     * @param tau
	     */
	    public synchronized void miseAJourTau(int i, int j, double tau){
	    	if(i < j){
					int tmp = i;
	    			i = j;
	    			j = tmp;
	    	}
	    	if(tau > AntColony.min && tau < AntColony.max){
	    		this.tau[i][j] = tau;
	    	}
	    	else if(tau < AntColony.min ){
	    		this.tau[i][j] = AntColony.min;
	    	}
	    	else if(tau > AntColony.max ){
	    		this.tau[i][j] = AntColony.max;
	    	}
	    }
	    
	    /**fonction qui retourne l'instance
	     * @return
	     */
	    public Instance getInstance(){
	    	return this.instance;
	    }
	   
	   /**méthode qui initialise tau
	    */
	   public void initialiserTau(){
		    System.err.println("Réinitialisation des phéromones.");
	    	this.tau0 = AntColony.max;
	    	
	    	tau = new double[instance.getNbSommets()][instance.getNbSommets()];	 
	    	for(int i = 0 ; i < this.instance.getNbSommets(); i++){
	    		for(int j = 0 ; j <= i; j++){
	    			this.tau[i][j] = this.tau0;
	    		}
	    	}
	    	
	    }
	   
	   /**méthode qui limite le nombre de phéromones
	    */
	   public void limitationDesPheromones() {
			System.err.println("//////////////////////////////////////////");
			AntColony.max = 1 / AntColony.ALPHA * 1 / Ant.meilleurChemin.getLongueurSolution();
			AntColony.min = AntColony.max / (2 * (double)(this.getInstance().getNbSommets()));
			int nbSommet = this.getInstance().getNbSommets();
			double p = 0;
			
			for (int i = 0; i < nbSommet; i++) {
				for (int j = 0; j <nbSommet; j++) {
					
					if (i != j) {
						p = this.getTau(i, j);
						if (p < AntColony.min) {
							this.miseAJourTau(i, j, AntColony.min);
						} else if (p > AntColony.max) {
							this.miseAJourTau(i, j, AntColony.max);
						}

					}
			}
		}
	}
}
